package com.xyking.lambda.cart;

import com.xyking.lambda.cart.imp.SkuPredicate;

import java.util.ArrayList;
import java.util.List;

/**
 * 购物车服务类
 */
public class CartService {
	// 加入购物车的商品信息
	private static List<Sku> cartSkuList = new ArrayList<Sku>(){
		{
			add(new Sku(10000, "JAVA虚拟机", 120.6, 1, 120.6, SkuCategoryEnum.BOOKS));
			add(new Sku(10001, "算法", 150.6, 1, 150.6, SkuCategoryEnum.BOOKS));
			add(new Sku(10002, "无人机", 4999.00, 1, 4999.00, SkuCategoryEnum.ELECTRONICS));
			add(new Sku(10003, "VR-一体机", 2299.00, 1, 2299.00, SkuCategoryEnum.ELECTRONICS));
			add(new Sku(10004, "JAVA编程思想", 79.8, 1, 79.8, SkuCategoryEnum.BOOKS));
			add(new Sku(10005, "JAVA核心技术", 149.00, 1, 149.00, SkuCategoryEnum.BOOKS));
			add(new Sku(10006, "跑步机", 2699.00, 1, 2699.00, SkuCategoryEnum.SPORTS));
			add(new Sku(10007, "男士纯色卫衣", 1227.00, 1, 1227.00, SkuCategoryEnum.CLOTHING));
			add(new Sku(10008, "工装裤", 528.00, 1, 528.00, SkuCategoryEnum.CLOTHING));
		}
	};

	/**
	 * 获取商品信息列表.
	 *
	 * @return .
	 */
	public static List<Sku> getCartSkuList() {
		return cartSkuList;
	}

	/**
	 * Version 1.0.0
	 * 找出购物车中所有电子产品
	 * @param cartSkuList .
	 * @return .
	 */
	public static List<Sku> filterElectronicsSkus(List<Sku> cartSkuList) {
		List<Sku> result = new ArrayList<>();
		for (Sku sku : cartSkuList) {
			// 如果商品类型 等于  电子类
			if (SkuCategoryEnum.ELECTRONICS.
					equals(sku.getSkuCategory())) {
				result.add(sku);
			}
		}
		return result;
	}

	/**
	 * Version 2.0.0
	 * 根据传入商品类型参数,找出购物车中同种商品类型的商品列表
	 * @param cartSkuList .
	 * @param category 商品类型 .
	 * @return .
	 */
	public static List<Sku> filterSkusByCategory(List<Sku> cartSkuList, SkuCategoryEnum category) {
		List<Sku> result = new ArrayList<>();
		for (Sku sku : cartSkuList) {
			// 如果商品类型 等于  传入的商品类型
			if (category.
					equals(sku.getSkuCategory())) {
				result.add(sku);
			}
		}
		return result;
	}


	/**
	 * Version 3.0.0
	 * 支持通过商品类型或总价来过滤商品
	 * @param cartSkuList .
	 * @param category 商品类型 .
	 * @param totalPrice 商品总价 .
	 * @param categoryOrPrice 判断是根据商品类型过滤还是根据总价过滤 .
	 * @return .
	 */
	public static List<Sku> filterSkus(List<Sku> cartSkuList, SkuCategoryEnum category, Double totalPrice, Boolean categoryOrPrice) {
		List<Sku> result = new ArrayList<>();
		for (Sku sku : cartSkuList) {
			if ((categoryOrPrice && category.equals(sku.getSkuCategory()))
					|| (!categoryOrPrice && sku.getTotalPrice() <= totalPrice)) {
				result.add(sku);
			}
		}
		return result;
	}

	/**
	 * Version 4.0.0
	 * 根据不同的Sku判断标准,对Sku列表进行过滤
	 * @param cartSkuList .
	 * @param predicate 不同的Sku判断标准
	 * @return .
	 */
	public static List<Sku> filterSkus(List<Sku> cartSkuList, SkuPredicate predicate) {
		List<Sku> result = new ArrayList<>();
		for (Sku sku : cartSkuList) {
			if (predicate.test(sku)) {
				result.add(sku);
			}
		}
		return result;
	}
}
